<?php

class Secutiry {

    private static $allowed = array();
    private static $class;
    private static $method;

    /**
     * Configura o array com todas as classes e suas devidas permissoes
     * @param type Array associativo
     * Ex.
     * Secutiry::allow(
      array('HomeController' => array(
      'index' => array('required' => true, 'perfil' => array(PerfilAcesso::$cliente), 'pagina'=>'Erro'),
      'Erro'  => array('required' => false)
      )
      )
      );
     */
    public static function allow($confClass) {
        foreach ($confClass as $key => $value) {
            foreach ($value as $k => $v) {
                self::$allowed[$key][$k] = $v;
            }
        }
    }

    /*
     * Retorna o array contendo as casses e suas devidas permissoes.
     */

    public static function getAllowed() {
        return self::$allowed;
    }

    /*
     * Verifica as permissoes
     * @param nome da classe
     * @param nome do metodo
     */

    public static function isRules($class, $method) {

        self::$class = $class;
        self::$method = $method;

        if (self::checkClass()) {
            if (self::checkMethod()) {
                if (self::checkProfille()) {
                    return true;
                } else {
                    return false;
                };
            }else{
            	return true;
            }
        } else {
            return true;
        }
    }

    /**
     * Verificar se a classe possui alguma restricao
     * @return boolean 
     */
    private static function checkClass() {
        if (key_exists(self::$class, self::$allowed)) {
            return true;
        }

        return false;
    }

    /**
     * Verifica se o methodo possui alguma restricao
     * @return boolean 
     */
    private static function checkMethod() {
        if (key_exists(self::$method, self::$allowed[self::$class])) {
            return true;
        }

        return false;
    }

    /**
     * Verifica se o usuario logado possui a permissao para executar o metodo
     * @return boolean 
     */
    private static function checkProfille() {
        if (self::$allowed[self::$class][self::$method]['required']) {
            if (isset(self::$allowed[self::$class][self::$method]['perfil'])) {
                $perfil = self::$allowed[self::$class][self::$method]['perfil'];
                
                if (!is_null(Session::getValue('user'))) {
                	$user = Session::getValue('user');
                	$user = $user['profille'];          	
	                foreach ($perfil as $p) {
	                        foreach ($user as $u) {
	                            if ($p == $u) {
	                            	if(self::isValidToken(Session::getValue('token'))){
		                                return true;
	                            	}
	                            }
	                        }
	                }
                }
                return false;
            } else {
                return false;
            }
        }
        return true;
    }

    /**
     * Registra o usuario fornecido na sessao.
     * @param array $user Objeto do usuario.
     * @param string $username Login do usuario.
     * @return Token gerado para o usuario.
     */
    public static function registerUser($user, $username) {
        Session::setValue('user', $user);
        Session::setValue('token', self::generateToken($username));

        return Session::getValue('token');
    }

    /**
     * Gera um token baseado no nome de usuario fornecido.
     * @param string $username Nome do usuario.
     * @return String do token gerado.
     */
    private static function generateToken($username) {
        $token = $username . date("D, d M Y H:i:s", mktime()) . 'FUTURA_TOKEN';
        $token = sha1($token);

        return $token;
    }

    /**
     * Verifica se o token fornecido esta valido na sessao.
     * @param string $token
     */
    private static function isValidToken($token) {
        
        if (Session::getValue('token')) {
            return (Session::getValue('token') == $token) ? true : false;
        }

        return false;
    }

    /**
     * Verifica se ja existe um usuario registrado na sessao.
     * @return True se ja existe um usuario registrado na sessao.
     */
    private static function isAuthenticated() {
        return (Session::getValue('user')) ? true : false;
    }

    /**
     * Desloga o usuario autenticado na sesssao.
     */
    public static function logout() {
        Session::destroy('token');
        Session::destroy('user');
        Session::freeSession();
		return true;
    }

    /**
     * Aplica seguranca na pagina, caso o usuario nao possua permissao de acesso a pagina,
     * este sera redirecionado para a URL de login.
     */
    public static function secure($class, $method) {
        if (self::isRules($class, $method)) {
            return true;
        }
        return false;
    }
    
    /**
     * Retorna pagina para redirecionamento
     * @param nome da classe
     * @param nome do metodo
     */
    public static function getPage($class, $method){
    	return isset(self::$allowed[self::$class][self::$method]['pagina']) ? self::$allowed[self::$class][self::$method]['pagina'] : FALSE; 
    }

}
?>